package com.sany.cxp.RabbitMQ.创建交换机与队列;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

/**
 * @Author: Thomas
 * @Date: 2024-01-07  16:10:16
 * @Description:
 */
public class Test {
    public static void main(String[] args) {
        // 1. 创建连接工程
        ConnectionFactory connectionFactory = new ConnectionFactory();
        connectionFactory.setHost("120.26.196.115");
        connectionFactory.setPort(5672);
        connectionFactory.setUsername("admin");
        connectionFactory.setPassword("admin");
        // 设置虚拟机节点
        connectionFactory.setVirtualHost("/");

        Connection connection = null;
        Channel channel = null;
        try {
            // 2. 创建连接
            connection = connectionFactory.newConnection("生产者");
            // 3. 通过连接获取通道
            channel = connection.createChannel();
            // 4. 准备发送消息
            String message = "这个消息是info~";
            // 5. 准备交换机并发送消息
            // 交换机名字
            String exchange = "direct_build_exchange";
            // 指定交换机的类型
            String type = "direct"; // 指定类型

            // 6. 定义交换机（构建交换机）
            channel.exchangeDeclare(exchange, type, true);
            // 7. 定义队列（构建队列）
            /*
            第一个参数: 队列名称
            第二个参数: 是否持久化，非持久化 - rabbtimq遇见故障、重启、或者最后一个消费者消费完消息并关闭连接后，就会删除该队列。
            第三个参数: 排他性，是否是独占队列
            第四个参数: 是否自动删除，随着最后一个消费者消息完毕消息后，是否把队列自动删除
            第五个参数: 携带的附加参数 --- 衍生出了header模式
             */
            channel.queueDeclare("queue001", true, false, false, null);
            channel.queueDeclare("queue002", true, false, false, null);
            channel.queueDeclare("queue003", true, false, false, null);
            // 8. 绑定交换机与队列的关系
            channel.queueBind("queue001", exchange, "user");
            channel.queueBind("queue002", exchange, "order");
            channel.queueBind("queue003", exchange, "course");
            channel.queueBind("queue003", exchange, "user");

            channel.basicPublish(exchange, "user", null, message.getBytes());
            System.out.println("消息发送成功~");
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 7. 关闭通道
            if (channel != null && channel.isOpen()) {
                try {
                    channel.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            // 8. 关闭连接
            if (connection != null && connection.isOpen()) {
                try {
                    connection.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
